bitkeeper revision 1.825.1.7 (4062f47b6DnJOl2ZC6ptnk2jUPSAHA)
authoriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>
Thu, 25 Mar 2004 15:02:19 +0000 (15:02 +0000)
committeriap10@tetris.cl.cam.ac.uk <iap10@tetris.cl.cam.ac.uk>
Thu, 25 Mar 2004 15:02:19 +0000 (15:02 +0000)
add dom0 op for controlling shadow page tables

xen/common/dom0_ops.c
xen/common/shadow.c
xen/include/hypervisor-ifs/dom0_ops.h
xen/include/xen/shadow.h

index a5f7041f0b402a84934cfaf295faa7923caa5ded..01075e756070698adf254fc66f629c712bc5077a 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/pdb.h>
 #include <xen/trace.h>
 #include <xen/console.h>
+#include <xen/shadow.h>
 #include <hypervisor-ifs/sched_ctl.h>
 
 extern unsigned int alloc_new_dom_mem(struct task_struct *, unsigned int);
@@ -485,6 +486,19 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
                                         op->u.pcidev_access.enable);
     }
     break;
+
+    case DOM0_SHADOW_CONTROL:
+    {
+        struct task_struct *p; 
+       
+       p = find_domain_by_id( op->u.shadow_control.domain );
+       if ( p )
+       {
+            ret = shadow_mode_control(p, op->u.shadow_control.op );
+           put_task_struct(p);
+        }
+    }
+    break;
      
     default:
         ret = -ENOSYS;
index 29c7f9a8b946420d9181bdc08ee2e1becb7016be..37114fe892ff8eae2ebcd29e94c88fd56d66e4b4 100644 (file)
@@ -26,6 +26,28 @@ hypercall lock anyhow (at least initially).
 
 ********/
 
+int shadow_mode_control( struct task_struct *p, unsigned int op )
+{
+       if (p->mm.shadow_mode && op == DOM0_SHADOW_CONTROL_OP_OFF )
+    {
+               shadow_mode_disable(p);
+       }
+       else if (p->mm.shadow_mode && op == DOM0_SHADOW_CONTROL_OP_ENABLE_TEST )
+       {
+        shadow_mode_disable(p);
+        shadow_mode_enable(p, SHM_test);
+       }       
+       else if (p->mm.shadow_mode && op == DOM0_SHADOW_CONTROL_OP_FLUSH )
+    {
+               //shadow_mode_flush(p);
+    }
+       else
+    {
+               return -EINVAL;
+    }
+
+       return 0;
+}
 
 int shadow_mode_enable( struct task_struct *p, unsigned int mode )
 {
index 8574f02531ff713828d080f797142428cae0621e..6e4b9b18c725ab122c64a003ec271371f38981a9 100644 (file)
@@ -214,6 +214,22 @@ typedef struct dom0_pcidev_access_st
     int          enable;
 } dom0_pcidev_access_t;
 
+/* 
+ * Control shadow pagetables operation
+ */
+#define DOM0_SHADOW_CONTROL   24
+
+#define DOM0_SHADOW_CONTROL_OP_OFF         0
+#define DOM0_SHADOW_CONTROL_OP_ENABLE_TEST 1
+#define DOM0_SHADOW_CONTROL_OP_FLUSH       10
+typedef struct dom0_shadow_control_st
+{
+    /* IN variables. */
+    domid_t      domain;
+    int          op;
+} dom0_shadow_control_t;
+
+
 typedef struct dom0_op_st
 {
     unsigned long cmd;
@@ -239,6 +255,7 @@ typedef struct dom0_op_st
         dom0_gettbufs_t         gettbufs;
         dom0_physinfo_t         physinfo;
         dom0_pcidev_access_t    pcidev_access;
+       dom0_shadow_control_t   shadow_control;
     } u;
 } dom0_op_t;
 
index 3d3fa61166f274fb9e39f3867d746adc98e0496c..2389fcae18c9a4d9056f465952ae6f1bb914513c 100644 (file)
@@ -22,6 +22,7 @@
 #define shadow_linear_pg_table ((l1_pgentry_t *)SH_LINEAR_PT_VIRT_START)
 #define shadow_linear_l2_table ((l2_pgentry_t *)(SH_LINEAR_PT_VIRT_START+(SH_LINEAR_PT_VIRT_START>>(L2_PAGETABLE_SHIFT-L1_PAGETABLE_SHIFT))))
 
+extern int shadow_mode_control( struct task_struct *p, unsigned int op );
 extern pagetable_t shadow_mk_pagetable( struct task_struct *p, 
                                                                                unsigned long gptbase);
 extern int shadow_fault( unsigned long va, long error_code );